#!/usr/bin/env python
# -*- coding: utf-8 -*-

# Hazırlayan : Rahman Yazgan
# Lisans & License : GPL v.3
# Sürüm : 1.1

import os, sys, threading

from PyQt4 import QtGui, QtCore
from ui_isimlendirici import Ui_MainWindow

class isimlendirici(QtGui.QMainWindow, Ui_MainWindow):
    secilen_dizin = ""

    def __init__(self):
        QtGui.QMainWindow.__init__(self)
        self.setupUi(self)
        
        # Cleanlooks stili
        QtGui.QApplication.setStyle(QtGui.QStyleFactory.create("Cleanlooks"))

        os.chdir("/")
        
        self.programi_ekranda_ortala()

    def programi_ekranda_ortala(self):
        self.move((QtGui.QDesktopWidget().screenGeometry().width()- self.geometry().width())/2,\
                  (QtGui.QDesktopWidget().screenGeometry().height()- self.geometry().height())/2)

    def secilen_dizin(self):
        self.statusBar.clearMessage()

        # dosya_sayisini_bul.baslatabilirsin "False" değeri verirse başlatılmış bir thread işlemi
        # var demektir. Bu nedenle ikinci bir thread işleminin başlatılmasını engelliyoruz.
        # İşlem karışıklığını önlemek için bu programda gerekli.
        if dosya_sayisini_bul.baslatabilirsin == True:
            konum = QtGui.QFileDialog.getExistingDirectory(self, "/")

            # Türkçe karakterli dizinlerde sorun yaşamamak için unicode().encode("cp1254") ü kullanıyoruz.
            isimlendirici.calisma_dizini = str(unicode(konum).encode('cp1254'))

            if self.konum_lineEdit.setText(konum):
                pass

            # Thread başlatılıyor.
            dosya_sayisini_hesapla = dosya_sayisini_bul()
            dosya_sayisini_hesapla.start()
            
            self.konum_toolButton.setEnabled(False)
            
            # Signal: QtCore.QTimer.timeout()
            # Dosya sayısını hesaplama işlemi başladıktan sonra 1 milisaniye de bir
            # dosya_sayisi_label_guncelle fonksiyonu çalıştırılıyor.
            self.timer = QtCore.QTimer()
            self.connect(self.timer, QtCore.SIGNAL("timeout()"), self.dosya_sayisi_label_guncelle)
            self.timer.start(1)
        else:
            QtGui.QMessageBox.warning(self, u"Uyarı", u"Şu anda başlatılmış bir işlem var.\nLütfen bitmesini bekleyiniz.", "Tamam")
        
    def dosya_sayisi_label_guncelle(self): 
        self.dosya_sayisi_label.setText(str(dosya_sayisini_bul.dosya_sayisi))
        
        if dosya_sayisini_bul.baslatabilirsin == True:
            self.timer.stop()
            self.konum_toolButton.setEnabled(True)
            self.statusBar.showMessage(u"Dosya sayısı hesaplandı.")
            
            # Herhangi bir aksamaya karşı tedbir.
            self.dosya_sayisi_label.setText(str(dosya_sayisini_bul.dosya_sayisi))

    def baslat(self):
        self.statusBar.clearMessage()

        if self.konum_lineEdit.text().isEmpty() == False:
            if (dosyalari_isimlendir.baslatabilirsin == True) and (dosya_sayisini_bul.baslatabilirsin == True):

                soru = QtGui.QMessageBox.question(None, u'İsimlendirme',
                                                  u"Dosya isimlendirme işlemi başladıktan sonra isimlendirmeler geri alınamaz.\nİsimlendirme başlasın mı?",
                                                  QtGui.QMessageBox.Yes, QtGui.QMessageBox.No)

                if soru == QtGui.QMessageBox.Yes:
                    # Thread başlatılıyor.
                    isimlendir = dosyalari_isimlendir()
                    isimlendir.start()
                    
                    self.konum_toolButton.setEnabled(False)
                    
                    self.timer_2 = QtCore.QTimer()
                    self.connect(self.timer_2, QtCore.SIGNAL("timeout()"), self.statusbar_guncelle)
                    self.timer_2.start(1)
                elif soru == QtGui.QMessageBox.No:
                    pass
            else:
                QtGui.QMessageBox.warning(self, u"Uyarı", u"Şu anda başlatılmış bir işlem var.\nLütfen bitmesini bekleyiniz.", "Tamam")
        else:
            QtGui.QMessageBox.warning(self, "Konum", u"İsimlendirilecek dosyaların bulunduğu konumu seçiniz", "Tamam")
            
    def statusbar_guncelle(self):
        self.statusBar.showMessage("Dosyalar isimlendiriliyor...")
        
        if dosyalari_isimlendir.baslatabilirsin == True:
            self.timer_2.stop()
            self.konum_toolButton.setEnabled(True)
            self.statusBar.showMessage(u"Dosyalar başarıyla isimlendirildi.")
            QtGui.QMessageBox.information(self, "Tebrikler", u"Dosyalar başarıyla isimlendirildi.", "Kapat")

    def hakkinda(self):
        QtGui.QMessageBox.information(self, u"Hakkında", u"Bu program belirli bir dizindeki tüm dosyaları 1 den başlayarak klasördeki dosya sayısı ne kadarsa o sayıya kadar dosya uzantılarını muhafaza ederek isimlendirir.", "Kapat")

    def qtHakkinda(self):
        QtGui.QMessageBox.aboutQt(self)

    def closeEvent(self, event):
        # Dosya isimlendirme işlemi yapılırken program kapatılmaya çalışılırsa kullanıcıya durumla ilgili
        # bilgilendirme yapılıyor ve programın kapatılmasını isteyip istemediğine dair soru soruluyor.
        if (dosyalari_isimlendir.baslatabilirsin == False):
            soru = QtGui.QMessageBox.question(None, u'Kapat', u"Şu anda dosya isimlendirme işlemi yapılmaktadır. Programı kapatmak istediğinizden emin misiniz?",
                                              QtGui.QMessageBox.Yes, QtGui.QMessageBox.No)

            if soru == QtGui.QMessageBox.Yes:
                event.accept()

            if soru == QtGui.QMessageBox.No:
                event.ignore()
                
        if (dosya_sayisini_bul.baslatabilirsin == False):
            event.accept()

class dosya_sayisini_bul(threading.Thread):
    baslatabilirsin = True
    dosya_sayisi = 0

    def __init__(self):
        threading.Thread.__init__(self)

    def run(self):
        dosya_sayisini_bul.baslatabilirsin = False
        
        sayac = 0
        
        for ana_dizin, dizinler, dosyalar in os.walk(isimlendirici.calisma_dizini, topdown=False):
            for dosya in dosyalar:
                sayac += 1
                dosya_sayisini_bul.dosya_sayisi = sayac

        dosya_sayisini_bul.baslatabilirsin = True

class dosyalari_isimlendir(threading.Thread):
    baslatabilirsin = True

    def __init__(self):
        threading.Thread.__init__(self)

    def run(self):
        dosyalari_isimlendir.baslatabilirsin = False

        dosya_listesi = []
        sayilar = []
        sayilar_duzenli = []

        for ana_dizin, dizinler, dosyalar in os.walk(isimlendirici.calisma_dizini, topdown=False):
            for dosya in dosyalar:
                dosyalar = os.path.join(ana_dizin, dosya).replace('\\', '/')
                dosya_listesi.append(dosyalar)

        for sayi in xrange(1, dosya_sayisini_bul.dosya_sayisi, 1):
            sayilar.append('00000000000' + str(sayi))
            sayilar_duzenli.append(str(sayi))

        sayilar.append('00000000000' + str(len(sayilar) + 1))
        sayilar_duzenli.append(str(len(sayilar)))

        for sayi in sayilar:
            dosya_adi = isimlendirici.calisma_dizini + '/' + sayilar[int(sayi) - 1]
            dosya_uzantisi = dosya_listesi[int(sayi) - 1][dosya_listesi[int(sayi) - 1].rfind('.'):]

            try:
                os.rename(dosya_listesi[int(sayi) - 1], dosya_adi + dosya_uzantisi)
            except:
                for sayi in sayilar_duzenli:
                    dosya_adi_kaynak = isimlendirici.calisma_dizini + '/' + sayilar[int(sayi) - 1]
                    dosya_adi_hedef = isimlendirici.calisma_dizini + '/' + sayilar_duzenli[int(sayi) - 1]
                    dosya_uzantisi = dosya_listesi[int(sayi) - 1][dosya_listesi[int(sayi) - 1].rfind('.'):]

                    os.rename(dosya_adi_kaynak + dosya_uzantisi, dosya_adi_hedef + dosya_uzantisi)
                    
                    dosyalari_isimlendir.baslatabilirsin = True

        for sayi in sayilar_duzenli:
            dosya_adi_kaynak = isimlendirici.calisma_dizini + '/' + sayilar[int(sayi) - 1]
            dosya_adi_hedef = isimlendirici.calisma_dizini + '/' + sayilar_duzenli[int(sayi) - 1]
            dosya_uzantisi = dosya_listesi[int(sayi) - 1][dosya_listesi[int(sayi) - 1].rfind('.'):]

            os.rename(dosya_adi_kaynak + dosya_uzantisi, dosya_adi_hedef + dosya_uzantisi)

            dosyalari_isimlendir.baslatabilirsin = True

if __name__ == "__main__":
    uygulama = QtGui.QApplication([])
    program = isimlendirici()
    program.show()
    sys.exit(uygulama.exec_())
